#include <iostream>
#include <cstring>
using namespace std;

/*
	什么时候调用拷贝构造？
	   一句话：右边的对象初始化赋值给左边的新对象
*/

class Cat
{
public:
	//定义猫类的构造函数
	Cat()
	{
		cout<<"猫的构造函数，当前对象是: "<<this<<endl;
	}
	//自己写个拷贝构造
	Cat(const Cat &other)
	{
		cout<<"猫的拷贝构造函数被调用了"<<endl;
	}
private:
	
};

Cat fun()
{
	cout<<"fun函数返回猫的对象"<<endl;
	Cat temp;
	return temp;
}

int main(int argc,char **argv)
{
	Cat c1; //调用构造函数
	//写法1：
	Cat c2=c1;  //c2调用拷贝构造
	//写法2：
	Cat c3(c1); //c3调用拷贝构造
	//写法3：
	Cat c4=Cat(c1);  //c4调用拷贝构造
	//写法4：
	Cat *c5=new Cat(c1);  //c5调用拷贝构造
	//写法5：取决于编译器实现，有些编译系统是可以调用拷贝构造的
	//Cat ret=fun();
	
	//delete c5;
	return 0;	
}